#include <stdio.h>
#include <stdarg.h>

/*
C函数要在程序中用到以下这些宏:
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
*/

/*
va_list:用来保存宏va_start、va_arg和va_end所需信息的一种类型。为了访问变长参数列表中的参数，
				必须声明 va_list 类型的一个对象       定义： typedef char *  va_list;

va_start:访问变长参数列表中的参数之前使用的宏，它初始化用va_list声明的对象，初始化结果供宏va_arg和va_end使用；

va_arg: 展开成一个表达式的宏，该表达式具有变长参数列表中下一个参数的值和类型。每次调用va_arg都会修改
        用va_list声明的对象，从而使该对象指向参数列表中的下一个参数；

va_end:该宏使程序能够从变长参数列表用宏va_start引用的函数中正常返回。

va在这里是variable-argument(可变参数)的意思.
*/

int my_Add_function(int num,...);

int main(int argc, char *argv[])
{
  printf("5+6 = %d\r\n",my_Add_function(2,5,6));
  printf("5+6+7 = %d\r\n",my_Add_function(3,5,6,7));
  
  return 0;
}

int my_Add_function(int num,...)
{
  va_list valist;
  int sum = 0;

  /* 为num个参数初始化valist */
  va_start(valist,num);

  /* 访问所有赋值给valist的参数 */
  for (size_t i = 0; i < num; i++)
  {
    sum += va_arg(valist,int);
  }
  
  /* 清理为valist保留的内存 */
  va_end(valist);

  return sum;
}